#include "Plant.h"
#include <iostream>

//integer getObjectType 
//	mengembalikan nilai integer tipe_object(kode tanaman 3)
int Plant::getObjectType() const
{
	return tipe_object;
}
//constructor
//	inisialiasi :
//		tipe_object = 3
//		iswatered = false
//		happy_meter = 0
Plant::Plant(int a,int b,int c, bool d , int e, int f) : Object(3),plant_id(a),tingkat_dewasa(b),tingkat_panen(c),repanenable(d),musim_tumbuh(e)
{
	//inisialiasasi tiap object(didapat dari kelas Object)
	//tipe object plant adalah 3
	//sengaja dikomentarin, inisialisasi DILAKUKAN di constructor initialization list, BUKAN di implementasi(akibat const)
	//tipe_object = 3;
	//---
	
	iswatered = false;
	happy_meter = 0;
	umur = f;
}

//void SetX
//	set location.x = new_x
void Plant::SetX(int new_x)
{
	x = new_x;
}

//void SetY
//	set location.y = new_y	
void Plant::SetY(int new_y)
{
	y = new_y;
}

//void GetX
//	set location.x = new_x
int Plant::GetX() const
{
	return x;
}

//void GetY
//	set location.y = new_y	
int Plant::GetY() const
{
	return y;
}

//integer GetMusim_tumbuh()
//	bernilai 0 jika tumbuhan ini hanya dapat tumbuh di musim kemarau
//	bernilai 1 jika tumbuhan ini hanya dapat tumbuh di musim hujan
int Plant::GetMusimTumbuh() const
{
	return musim_tumbuh;
}

//void SetUmur(int a)
//	set umur tanaman
void Plant::SetUmur(int a)
{
	umur = a;
}

//integer GetUmur()
//	mengembalikan umur tanaman
int Plant::GetUmur() const
{
	return umur;
}

//integer GetPlantId()
// mengembalikan id tanaman
int Plant::GetPlantId() const
{
	return plant_id;
}

//void SetHappyMeter(int a)
//	set happy_meter tanaman
void Plant::SetHappyMeter(int a)
{
	happy_meter = a;
}

//integer GetHappyMeter()
//	mengembalikan nilai happy_meter tanaman
int Plant::GetHappyMeter() const
{
	return happy_meter;
}

//integer GetTingkatDewasa()
//	mengembalikan nilai tingkat_dewasa
int Plant::GetTingkatDewasa() const
{
	return tingkat_dewasa;
}

//integer GetTingkatPanen()
//	mengembalikan nilai tingkat panen
int Plant::GetTingkatPanen() const
{
	return tingkat_panen;
}

//integer SetTingkatPanen()
//	set nilai tingkat panen
void Plant::SetTingkatPanen(int val)
{
	tingkat_panen = val;
}


//void SetWatered(bool value)
//	set variable boolean iswatered menjadi value
//	JANGAN GUNAKAN METHOD INI JIKA PLAYER MENYIRAM TANAMAN, GUNAKAN watered()!!!!
//	METHOD INI HANYA DIGUNAKAN UNTUK INISIALISASI VARIABEL iswatered!!!
void Plant::SetWatered(bool value)
{
	iswatered = value;
}

//boolean isWatered()
//	Fungsi isWatered() harus diimplementasikan di kelas anak
//	isWatered mengembalikan nilai true jika tanaman sudah disiram
bool Plant::isWatered() const
{
	return iswatered;
}

//boolean isSeed()
//	Fungsi isSeed() harus diimplementasikan di kelas anak
//	isSeed mengembalikan nilai true jika happy_meter < tingkat_dewasa(ada di kelas anak) 
bool Plant::isSeed() const
{
	return (happy_meter < tingkat_dewasa);
}

//boolean isMature()
//	Fungsi isMature() harus diimplementasikan di kelas anak
//	isMature() mengembalikan nilai true 
//	jika happy_meter >= tingkat_dewasa(ada dikelas anak) && happy_meter < tingkat_panen(ada dikelas anak)
bool Plant::isMature() const
{
	return (happy_meter >= tingkat_dewasa && happy_meter < tingkat_panen);
}

//boolean isHarvest()
//	Fungsi isHarvest() harus diimplementasikan di kelas anak
//	isHarvest() mengembalikan nilai true jika tanaman gak mati dan happy_meter >= tingkat_panen 
//	jika happy_meter >= tingkat_panen(ada di kelas anak)
bool Plant::isHarvest() const
{
	return (happy_meter >= tingkat_panen) && !isMati();
}

//boolean isRepanenable()
//	Fungsi isRepanenable() mengembalikan nilai true jika tanaman bisa dipanen
//	lebih dari sekali
//	UNTUK TANAMAN YANG BISA DIPANEN BERKALI2, KURANGI TITIK PANENNYA SETIAP KALI DIPANEN!!!
bool Plant::isRepanenable() const
{
	return repanenable;
}

//boolean isMati()
//	Fungsi isMati() mengembalikan nilai true jika tanaman mati(umur==0)
//	Umur tanaman TIDAK lagi berkurang jika sudah mati
bool Plant::isMati() const
{
	return (umur==0);
}


//Void grow()
//	fungsi grow() adalah fungsi untuk menumbuhkan tanaman
//	Cek terlebih dahulu apakah musim cocok untuk tanaman?
//		jika iya,lakukan:
//		umur--(kecuali kalo udah mati)
//		iswatered=false
//		
void Plant::grow()
{
	if(Kalendar::GetMusim()==GetMusimTumbuh()) {//jika musim sekarang sama dengan musim tumbuh si tanaman
		if(!isMati()) {
			umur--;
			if(iswatered) {//jika tanaman sudah disiram
				happy_meter++;
			}
		}
	}else{//jika musim tumbuh tanaman tidak cocok dengan musim sekarang, tanaman mati
		SetUmur(0);
	}
	iswatered = false;
}
